/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Compilador.Lexico.Automatos;

import java.util.ArrayList;

/**
 *
 * @author Rafa
 */
public class AutomatoString extends Automato {

    private String cadeiaAtual;
    private boolean stringLonga;

    public AutomatoString() {
        this.estadosAutomatos = new ArrayList<EstadoAutomato>();
        this.criaEstados();
        this.cadeiaAtual = "";
        this.stringLonga = false;
    }

    public boolean isStringLonga() {
        return stringLonga;
    }

    public String getCadeiaAtual() {
        if (!stringLonga) {
            return this.cadeiaAtual.substring(1, cadeiaAtual.length() - 1);
        } else {
            return this.cadeiaAtual.substring(2 + quantidadeIgual, cadeiaAtual.length() - (2 + quantidadeIgual));
        }

    }

    /*
     * Retorna -1 se não reconheceu o símblo
     * Retorna 0 se reconheceu o novo símbolo e não se encontra em um estado final
     * Retorna 1 se reconheceu o novo símbolo e se encontra em um estado final
     */
    public int addSimbolo(char simbolo) {


        if (estadoAtual.getNome().equals("q0") && simbolo == '[') {
            this.stringLonga = true;
        }

        this.estadoAtual = estadoAtual.getEstado(simbolo);
        if (estadoAtual == null) {
            return -1;

        } else {

            if (simbolo == '\n' && (cadeiaAtual.equals("[[") || cadeiaAtual.charAt(0) == '[' && cadeiaAtual.charAt(cadeiaAtual.length() - 1) == '[' && cadeiaAtual.charAt(cadeiaAtual.length() - 2) == '=')) {
            } else {
                this.cadeiaAtual += String.valueOf(simbolo);
            }

            if (!estadoAtual.isEstadoFinal) {
                return 0;
            } else {
                return 1;
            }
        }


    }

    private void criaEstados() {
        EstadoAutomato q0, q1, q2, q3, q4, q5, q6, q7, q8, q9,q10;
        q0 = null;
        q1 = null;
        q2 = null;
        q3 = null;
        q4 = null;
        q5 = null;
        q6 = null;
        q7 = null;
        q8 = null;
        q9 = null;
        q10 = null;

        //Cria estados;
        q0 = new EstadoAutomato(false, false, "q0");
        q1 = new EstadoAutomato(false, true, "q1");
        q2 = new EstadoAutomato(true, false, "q2");
        q3 = new EstadoAutomato(false, true, "q3");
        q4 = new EstadoAutomato(true, false, "q4");
        q5 = new EstadoAutomatoEmpilha(false, false, "q5", '=', this);
        q6 = new EstadoAutomato(false, true, "q6");
        q7 = new EstadoAutomatoDesempilha(false, false, "q7", '=', this);
        q8 = new EstadoAutomato(true, false, "q8");
        q9 = new EstadoAutomato(false, false, "q9");
        q9.estadoDefault = q3;
        q10 = new EstadoAutomato(false, false, "q10");
        q10.estadoDefault = q1;
        q0.addTransicao('\'', q1);
        q0.addTransicao('\"', q3);
        q0.addTransicao('[', q5);
        q1.addTransicao('\\', q10);
        q1.addTransicao('\'', q2);
        q3.addTransicao('\\', q9);
        q3.addTransicao('\"', q4);
        q5.addTransicao('=', q5);
        q5.addTransicao('[', q6);
        q6.addTransicao(']', q7);
        q7.addTransicao('=', q7);
        q7.addTransicao(']', q8);
        this.estadoAtual = q0;
        estadosAutomatos.add(q0);
        estadosAutomatos.add(q1);
        estadosAutomatos.add(q2);
        estadosAutomatos.add(q3);
        estadosAutomatos.add(q4);
        estadosAutomatos.add(q5);
        estadosAutomatos.add(q6);
        estadosAutomatos.add(q7);
        estadosAutomatos.add(q8);



    }
}
